package com.tedu.API;

/**
 * JavaSE:基础语法，JavaOOP面向对象编程。JavaAPI(帮助文档，理解：字典)
 *
 * JavaAPI【内置】提供大量类，接口，抽象类，异常，错误
 * 【预计提供好的类库：8000.JavaAPI只学重点】
 *
 * JavaAPI:字符串，包装类，集合【泛型】线程
 * 多线程【并发-大数据】，I0流，Socket套接字【网络编程】
 *
 *
 */
package com.tedu.API;



import org.junit.Test;

import java.util.Locale;

import static org.junit.jupiter.api.Assertions.assertTrue;



/**
 * Unit test for simple App.
 */
public class StringAPI {

    /**
     * Rigorous Test :-)
     */


    /**
     * JavaSE；基础语法，JavaOOP面向对象编程，JavaAPI（帮助文档，理解：字典
     *
     * JavaAPI【内置】提供大量类、接口、抽象类、异常、错误
     * 【预计提供好的类库：8000，JavaAPI只学重点】
     *
     * JavaAPI：字符串、包装类、集合【泛型】、线程、
     *         多线程【并发--大数据】、IO类、Socket套接字【网络编程】
     *
     *     jdk1.8.chm帮助文档   理解： 新华字典  会查类、接口、抽象..使用
     *     JDK版本---帮助文档  根据用什么版本JDK，查对应版本帮助文档
     *
     *    必须会查API     String类----什么包下？
     *                   java.lang【默认：不需要导入包】
     * java:错误：无效的源发行版，17
     * maven项目：自动下载：junit版本--testng级别【识别JDK17】
     * 调整maven项目jdk版本：17版本降级1.8版本
     * 找到pom.xml----17
     *
     */

    /**
     * JDK1.8 StringAPI类库：构造器怎么用。方法怎么用
     * 包位置：Java.lang【不需要导入包，System.String】
     * 特点：不需要导入包，不可以继承，字符数组,定义完毕对象无法修改
     * 可以覆盖：String 类是final，Java字符串编码集
     * 顶级UniCode：GBX，UTF-8，任何字符对应2个字节
     * 字符串底层：封装了字符数组级针对字符数组的操作算法
     * 字符数组===字符串
     * 定义：String str=“直接量”；  给定值创建String字符串对象
     * String str=new String （）；创建String字符串对象
     */
    @Test
    public void testString() {
        String str = "字符串";
        System.out.println("str");
        char[] c = {'字', '符', '串'};//字符数组：静态字符数组
        System.out.println(c);
        //字符串创建出来，无法修改，因为String是final修饰
        String s = "hello world";
        s = "123"; //对对象进行覆盖
        System.out.println(s);
    }

    /**
     * 定义给定值的方式：String str=“java123”
     * java为了提高性能：静态字符串（字面量/常量/连接后结果）
     * 创建String常量池中，对于重复创建静态字符串，JVM虚拟机首先
     * 会在常量池中查找，如果找到返回对象，找不到继续创建对象！
     * <p>
     * JVM会仔虚拟机的堆内存中开辟一块空间，保存曾经使用过的字面量|常量
     * 一旦后期又实用相同的字面量|常量，不会创建新对象，直接使用老对象
     * 好处：减少内存开销，提高性能
     */
    @Test
    public void testStrings() {
        String s1 = "java123";
        String s2 = "java123";
        System.out.println(s1 == s2);//true
        String s = "java";
        String s3 = s + "123";
        System.out.println(s1 == s3);//java123==java123  true
        String s4 = "java" + "123";
        //右侧：直接量方式详解，静态字符串，存入常量池中
        System.out.println(s2 == s4);
        //s2的java123从常量池中获取，s4拼接后静态字符串，从常量池获取
        //------上面的代码，给定值定义字符串方式，拥有常量池-------
        //------下面的代码：创建字符串：创建字符串对象方式-------
        String s5 = new String("java123");
        //new出来的对象，一定是新对象，不存在常量池
        System.out.println(s4 == s5);
    }
    /**
     * String API 方法
     * length方法     返回值：int
     * 作用：返回当前字符串的长度（个数）---值监狱数组length方法
     * 特点：字符串包含：特殊字符空格，字母，汉字
     *      String对象采用Uincode顶级编码：每个字符算1个，占2个字节
     */
    @Test
    public void testLength(){
        String str="Hello World";//10
        System.out.println(str.length());
        str="我爱Java";
        System.out.println(str.length());//7
    }
    /**
     * indexOf方法----重载功能：修饰符  返回值  方法名一致
     *                                      参数不一致
     * indexOf(int index)
     * 第一个参数 int index：传入下标位
     * 作用：查找制定字符串在当前字符串中位置，首位置
     *     如果匹配到对应字符，输出首位置下标
     *     如果没有匹配对应字符：返回-1值
     * indexOf(String str,int index)  返回值：int
     * 第一个参数 String str：传入制定字符串
     * 第二个参数int index：查找制定具体位置的下标
     * 作用：查找具体下标位的字符串在”当前字符串中“位置，首位置，
     *      如果查找相同名称，向下移位查找，不包含当前位置
     *      果没有匹配对应字符，返回-1值
     * lastIndexOf(String str)方法
     * 作用：找到匹配字符串中对应最后出现子字符的位置
     */
    @Test
    public void testIndexOf(){
        String str="thinking in java";//java编程思想【第四版】
        //返回值：下标位
        int index=str.indexOf("ja");//用处：查找第一位相同
        index=str.indexOf("in",6);
        //用处：查找指定某一位相同
        System.out.println("打印下标位："+index);
        //lastIndexOf（）找到最后一次出现的下标位置
        index=str.lastIndexOf("in");
        System.out.println("最后的下标位"+index);



    }
    /**
     * StringAPI针对字符串提供三种方法：截取，替换，分割【常用方法】
     * subString方法：               截取  返回值：String
     * subString（int start,int end)
     * 作用：截取字符串，从下标start位置开始截取，截取到end下标位置
     * subString（int index）
     * 作用：截取字符串，从下标index位置开始截取，截取到最后
     */

    @Test
    public void testSubString(){
        String url="www.baidu.com";//通过截取字符baidu
//    url=url.substring(4,8);   //.baidu. 3,10   .co 9,12
        System.out.println("截取子字符串："+url);
        //需求：通过截取字符串  .com
        url=url.substring(9);
        System.out.println("截取自字符串，截取到最后"+url);

    }
